package com.atguigu.spzx.manager.controller;

import com.atguigu.spzx.manager.service.SysUserService;
import com.atguigu.spzx.model.dto.sys.LoginDTO;
import com.atguigu.spzx.model.vo.common.R;
import com.atguigu.spzx.model.vo.sys.LoginVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@Slf4j
//@CrossOrigin(allowCredentials = "true" ,originPatterns = "*" )
@Tag(name = "登录页模块")
@RequestMapping("/admin/system/index")
public class IndexController {
    ////http://192.168.1.1:8501/admin/system/index/generateCodeImage
    /*
        springmvc:处理请求的流程
            1、请求访问后端项目时，通过ip查找服务器，通过端口号查找服务器中的一个程序
            2、tomcat服务器接收到请求，springmvc配置的DispatcherServlet会处理所有请求
                所有tomcat通过反射创建DispatcherServlet对象，并调用前端控制器的service方法处理请求(request response)
            3、DispatcherServlet的service处理请求的业务
                3.1 通过HandlerMapping匹配请求
                3.2 如果请求路径匹配不到资源 返回404,响应报文是默认报文没有配置跨域
                3.3 如果请求路径匹配到了资源
                    1、先比较请求方式
                        如果请求的请求方式和资源要求的请求方式一致，可以访问接口资源
                        如果请求的请求方式和资源要求的请求方式不一致，返回405,响应报文是默认报文没有配置跨域
                    2、再判断请求携带的参数是否满足springmvc接口资源的要求
                        接收参数时如果配置了参数时必须得，但是前端没有携带或者格式错误，返回400,响应报文是默认报文没有配置跨域

     */
    @Resource
    SysUserService sysUserService;
    // http://192.168.1.1:8501/admin/system/index/login  post
    @Operation(summary = "登录接口" ) //一般通过该注解代替方法的注释
    @PostMapping("login") ///admin/system/index/login
    public R login(@RequestBody LoginDTO loginDTO){
        //POJO入参 和请求体获取的对象 都不可能为空
        LoginVO loginVO = sysUserService.login(loginDTO);
        //r.data.loginVO.token
        return R.ok().data("loginVO" , loginVO);
    }
    /*
        获取图片验证码接口：
            需要返回验证码图片 和他的内容缓存到redis的key
     */
    @GetMapping("generateCodeImg")
    public R generateCodeImg(){
//        log.info();
        Map<String,Object> map =  sysUserService.generateCodeImg();
        //r.data.loginVO.token
        return R.ok().data(map);
    }

    /*
        登录成功后需要查询用户信息展示：
            1、后端是否需要参数： 需要token
                通过请求头携带token：
                    token:  xx

            2、后端查询：根据token在redis中查询登录成功的用户信息
            3、前端需要展示的数据：
                id：
                name：姓名
                avatar：头像地址

     */
//    @GetMapping("userInfo")
//    public R getUserInfo(@RequestHeader(value = "token" , required = false)String token){
//        Map<String,Object> map = sysUserService.getUserInfo(token);
//        return R.ok().data(map);
//    }
    @GetMapping("userInfo")
    public R getUserInfo(){
        Map<String,Object> map = sysUserService.getUserInfo();
        return R.ok().data(map);
    }
    /*
        注销接口：
            token
     */
    @Operation(summary = "注销接口")
    @PostMapping("logout")
    public R logout(@Parameter(description = "令牌",required = true , name = "token",in= ParameterIn.HEADER )
                        @RequestHeader(value = "token" , required = false)String token){
        sysUserService.logout(token);
        return R.ok();
    }
}
